{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 示例：轴承故障诊断"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "\n",
    "from fastphm.data import Dataset\n",
    "from fastphm.data.FeatureExtractor import FeatureExtractor\n",
    "from fastphm.data.labeler.BearingFaultLabeler import BearingFaultLabeler\n",
    "from fastphm.data.loader.bearing.XJTULoader import XJTULoader\n",
    "from fastphm.data.processor.RMSProcessor import RMSProcessor\n",
    "from fastphm.entity.Bearing import Fault\n",
    "from fastphm.metric.Evaluator import Evaluator\n",
    "from fastphm.metric.end2end.Accuracy import Accuracy\n",
    "from fastphm.metric.end2end.WeightedF1Score import WeightedF1Score\n",
    "from fastphm.data.stage.BearingStageCalculator import BearingStageCalculator\n",
    "from fastphm.data.stage.fpt.ThreeSigmaFPTCalculator import ThreeSigmaFPTCalculator\n",
    "from fastphm.model.pytorch.base.BaseTester import BaseTester\n",
    "from fastphm.model.pytorch.base.BaseTrainer import BaseTrainer\n",
    "from fastphm.model.pytorch.basic.CNN import CNN\n",
    "from fastphm.util.Plotter import Plotter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义 数据加载器、特征提取器、fpt计算器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[DEBUG   14:12:48]  \n",
      "[DataLoader]  Root directory: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\n",
      "\t✓ Bearing1_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_1\n",
      "\t✓ Bearing1_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_2\n",
      "\t✓ Bearing1_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_3\n",
      "\t✓ Bearing1_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_4\n",
      "\t✓ Bearing1_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_5\n",
      "\t✓ Bearing2_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_1\n",
      "\t✓ Bearing2_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_2\n",
      "\t✓ Bearing2_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_3\n",
      "\t✓ Bearing2_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_4\n",
      "\t✓ Bearing2_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_5\n",
      "\t✓ Bearing3_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_1\n",
      "\t✓ Bearing3_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_2\n",
      "\t✓ Bearing3_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_3\n",
      "\t✓ Bearing3_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_4\n",
      "\t✓ Bearing3_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_5\n"
     ]
    }
   ],
   "source": [
    "data_loader = XJTULoader('D:\\\\data\\\\dataset\\\\XJTU-SY_Bearing_Datasets')\n",
    "feature_extractor = FeatureExtractor(RMSProcessor(data_loader.continuum))\n",
    "fpt_calculator = ThreeSigmaFPTCalculator()\n",
    "stage_calculator = BearingStageCalculator(data_loader.continuum, fpt_calculator)\n",
    "Plotter.DPI = 80"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 构造数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    14:12:48]  [DataLoader]  -> Loading data entity: Bearing1_1\n",
      "[INFO    14:12:51]  [DataLoader]  ✓ Successfully loaded: Bearing1_1\n",
      "[INFO    14:12:51]  [DataLoader]  -> Loading data entity: Bearing1_4\n",
      "[INFO    14:12:53]  [DataLoader]  ✓ Successfully loaded: Bearing1_4\n",
      "[INFO    14:12:53]  [DataLoader]  -> Loading data entity: Bearing2_1\n",
      "[INFO    14:13:02]  [DataLoader]  ✓ Successfully loaded: Bearing2_1\n",
      "[INFO    14:13:03]  [DataLoader]  -> Loading data entity: Bearing1_2\n",
      "[INFO    14:13:06]  [DataLoader]  ✓ Successfully loaded: Bearing1_2\n",
      "[INFO    14:13:06]  [DataLoader]  -> Loading data entity: Bearing2_3\n",
      "[INFO    14:13:16]  [DataLoader]  ✓ Successfully loaded: Bearing2_3\n"
     ]
    }
   ],
   "source": [
    "fault_types = [Fault.NC, Fault.OF, Fault.IF, Fault.CF]\n",
    "labeler = BearingFaultLabeler(2048, fault_types, is_multi_hot=False)\n",
    "dataset = Dataset()\n",
    "for bearing_name in ['Bearing1_1', 'Bearing1_4', 'Bearing2_1', 'Bearing1_2', 'Bearing2_3']:\n",
    "    bearing = data_loader(bearing_name, 'Horizontal Vibration')\n",
    "    feature_extractor(bearing)\n",
    "    stage_calculator(bearing)\n",
    "    dataset.add(labeler(bearing))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 划分训练数据与测试数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "train_set, test_set = dataset.split_by_ratio(0.7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 配置训练算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_config = {\n",
    "    'device': torch.device('cuda' if torch.cuda.is_available() else 'cpu'),\n",
    "    'dtype': torch.float32,\n",
    "    'epochs': 20,\n",
    "    'batch_size': 128,\n",
    "    'lr': 0.01,\n",
    "    'weight_decay': 0.0,\n",
    "    'criterion': nn.CrossEntropyLoss(),\n",
    "}\n",
    "trainer = BaseTrainer(train_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义模型并训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    14:13:16]  \n",
      "[Trainer]  Start training by BaseTrainer:\n",
      "\ttraining set: Bearing1_1; Bearing1_4; Bearing2_1;…\n",
      "\tdevice: cuda\n",
      "\tdtype: torch.float32\n",
      "\tepochs: 20\n",
      "\tbatch_size: 128\n",
      "\tlr: 0.01\n",
      "\tweight_decay: 0.0\n",
      "\tcriterion: CrossEntropyLoss()\n",
      "\tcallbacks: []\n",
      "\toptimizer: Adam\n",
      "[INFO    14:13:17]  [BaseTrainer]  Epoch [1/20], CrossEntropyLoss:0.2655\n",
      "[INFO    14:13:17]  [BaseTrainer]  Epoch [2/20], CrossEntropyLoss:0.0759\n",
      "[INFO    14:13:18]  [BaseTrainer]  Epoch [3/20], CrossEntropyLoss:0.0603\n",
      "[INFO    14:13:18]  [BaseTrainer]  Epoch [4/20], CrossEntropyLoss:0.0497\n",
      "[INFO    14:13:19]  [BaseTrainer]  Epoch [5/20], CrossEntropyLoss:0.0243\n",
      "[INFO    14:13:19]  [BaseTrainer]  Epoch [6/20], CrossEntropyLoss:0.0529\n",
      "[INFO    14:13:19]  [BaseTrainer]  Epoch [7/20], CrossEntropyLoss:0.0163\n",
      "[INFO    14:13:20]  [BaseTrainer]  Epoch [8/20], CrossEntropyLoss:0.0133\n",
      "[INFO    14:13:20]  [BaseTrainer]  Epoch [9/20], CrossEntropyLoss:0.0402\n",
      "[INFO    14:13:20]  [BaseTrainer]  Epoch [10/20], CrossEntropyLoss:0.0551\n",
      "[INFO    14:13:21]  [BaseTrainer]  Epoch [11/20], CrossEntropyLoss:0.0346\n",
      "[INFO    14:13:21]  [BaseTrainer]  Epoch [12/20], CrossEntropyLoss:0.0252\n",
      "[INFO    14:13:22]  [BaseTrainer]  Epoch [13/20], CrossEntropyLoss:0.0110\n",
      "[INFO    14:13:22]  [BaseTrainer]  Epoch [14/20], CrossEntropyLoss:0.0085\n",
      "[INFO    14:13:22]  [BaseTrainer]  Epoch [15/20], CrossEntropyLoss:0.0062\n",
      "[INFO    14:13:23]  [BaseTrainer]  Epoch [16/20], CrossEntropyLoss:0.0047\n",
      "[INFO    14:13:23]  [BaseTrainer]  Epoch [17/20], CrossEntropyLoss:0.0050\n",
      "[INFO    14:13:23]  [BaseTrainer]  Epoch [18/20], CrossEntropyLoss:0.0067\n",
      "[INFO    14:13:24]  [BaseTrainer]  Epoch [19/20], CrossEntropyLoss:0.0036\n",
      "[INFO    14:13:24]  [BaseTrainer]  Epoch [20/20], CrossEntropyLoss:0.0066\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x280 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = CNN(2048, len(fault_types))\n",
    "losses = trainer.train(model, train_set)\n",
    "Plotter.loss(losses)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "tester = BaseTester()\n",
    "result = tester.test(model, test_set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 预测结果评价（故障诊断）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEcCAYAAAAoSqjDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAAxOAAAMTgF/d4wjAABC2klEQVR4nO3dd1gU1xrA4d8sRRRBsQUUERWNjYi9995j70oiKnbFXlCxRU0kGlPAEo1iiWK5JrEkxMQYu1ET21VQERBsWEAFZWHvH1wn2UB0V1nYNd+bZ56H3Tl75juTcb8950xRdDqdDiGEEALQ5HQAQgghzIckBSGEECpJCkIIIVSSFIQQQqgkKQghhFBJUhBCCKGSpCCEEEIlSUEIISzI6NGjcXd3R1EUzpw584/lVq9eTZkyZShdujSDBw8mJSXFoPolKQghhAXp1q0bv/76KyVKlPjHMteuXcPf35+DBw8SERHBrVu3WLFihUH1S1IQQggL0rBhQ1xdXV9YJjQ0lI4dO+Ls7IyiKPj6+rJp0yaD6rfOiiBzQu4qI3M6BLMUd3hZTodgthSUnA7BLFlbyX7JjL3t6+8XY7+n5vcvRWBgoPraz88PPz8/o7cbFRWl15Nwd3cnKirKoM9abFIQQgizpxg3GPOqSSArSVIQQghTUXKmF+bm5saVK1fU15GRkbi5uRn0WZlTEEIIU1E0xi1ZpGvXruzatYubN2+i0+kICgqiV69eBn1WkoIQQpiKohi3GGDo0KG4uroSExNDq1at8PDwAMDHx4ddu3YBUKpUKQICAqhXrx4eHh4ULlyYoUOHGhaypT5PQSaaMycTzf9MJpozJxPNmcuSieaaE4wqn3T8o9fe5uuSOQUhhDAVjVVOR2A0SQpCCGEqOTTR/DokKQghhKlk4eRxdpGkIIQQpiI9BSGEECrpKQghhFBJT0EIIYRKegpCCCFUkhSEEEKoNDJ8JIQQ4jnpKQghhFDJFc1CCCFUcvaREEIIlQwfCSGEUElPQQghhEp6CkIIIVTSUxBCCKGSnoIQQgiV9BSEEEKopKeQkbu7O3Z2dpw7dw5r6/TNVa9enY8++ojGjRsTFhZGQEAAsbGxODk5kS9fPmbPnk2DBg1MGleLuuWZNaIDttZWJCU/Y+T8zZy9fINqFdz4cGJX7PPkQqeDyUu2c+DE5Uzr6N2uBmMHNMNKo+F2fCJDZ4cQffM+ALY21izy60zzuuVJfqrl7OUY3p+xDmtrDRsXD6JEsYJci75L38lfkpqaRi5ba779YiTdxwbzIDHJpG03xihfH+7F30VRFPLY2zN+8jTeLldBr0xaWhrLl37E0UO/kpqayjteVZg8fSY2NrYcPfwrny5dopa9f/8eBQsWYt3mbSQkPGSy3xgePriPV5VqTJo+M73MvXtMmziO5UGrsLaxydb2GmqU7yDi4++iKBry2NszIZP9AhARfpmPFs7j3r14AIaNHEOTZi354/fTLJo/BwCtNgWvKtUYP3k6tra2XDh/jvkB/mi1KfT39qF9x3cBOHH8KGH79jDVPyDb2mmMxR/M48DP+4mLjWXT1h28Xa58hjJpaWksC/yQw4d+JVWrpXKVqkzzn4WNjS3hly+xcP5c7t+Lx8ramoqVPJkyfSZ2dnYkPHzIhHGjeHD/PlWqVWfqjFlA+rEyafwYPl/xJTbmeKxYYFLIloifPn3K6tWrM7wfFhZG//79WbRoEVeuXOHkyZMEBQVx69Ytk8aT3yE3a+Z7M9h/HTV7fsC0pTtZM38gAF8HDmZu0G5q9VxIv0lfsjKgH3a5Mh5sZd3fYsHYznQa8TnVuy9g3a6jLJvWU10/b3RHdIBnpznU6LGAqR/vAKBFnQrce/iEWj0X8iAxiZZ1079Ipg5uQ9DmA2aVEAAWLA5kw9adhGzZQZ/+3syZOT1DmV07tnHp4kXWbQ7l6x3folE0bN6wHoDadesTsmWHurxdrgKt2rYHYN/ub6lWoyYbQ/9DZOQ1rkSEA7B0ySKGj/Ez24QAsGDxx2zc+h82bNlBn/4DCZg5LUOZ5KQkJowdge/IMWzZ8R2bQnfhVaU6AGXLluOrDVvYsGUHm0J3ce9ePKFfbwRg3ZqVjJ88jbUbtrAq+LP0upKTWRn0KSPHjM++RhqpWYtWfPnVRlyKFv3HMju3h3Lx4gU2btnGtl270Wg0bAxJP1Zy5crF5Gn+bP9mD5tDd5KUlMTaL1cCsPu7b6heoxZbdnzDtWtXiQhP/6G25MOFjBo73jwTAqRf0WzMYgayJSnMnj2buXPn8uTJE733AwIC8Pf3p27duup7ZcqUoVu3biaNp1Txwtx7+JiLV28CcOj0FYo7O1G9YgkKOeXlp2OXAIiIus2DxCRa1cv4C7Cihwvnwm9w824CAPt+PU+rehUokM+ePHa2DHy3DrM+/UYtfys+EYAUbSp5ctsCkCe3Lc9StFQqU5S3S77Fth9Om7Tdr8LB0VH9+1FiIpmNkIZfvkTNWrWxsbFFURTq1G/A3u++yVDuzu3bnDx+lDbtOwJgZW3N0+Rk0tLSSHn2DBsbG44cOoijoyOe71Q2VZOyxF/3y+PERyiZ7Jm9e76lkmdlvKpUA8DKygqnAgUAsMudW016KSkpPH36FOX/48/W/98vT58+xUqT/k90ZdCn9OozQG+75qZa9Rq85ez8wjKXL/2XWrXrqMdK3foN+O6b/wDgVsKdsm+/DaTvq4qVKhF34waQvk+S/3asHPo1/Vh5p7KXSdv1WhTFuMUMZEtSqFy5Mk2aNOHjjz/We/+3336jTp062RGCnoio2xTIZ0/tyiUBaNfIE8e8uSn2Vn5u3k2ga4sqAFSr4EZZ9yKUKFowQx1/XL6BV7nieLgVAdKHkjQaDW4uTpQqXoj7CU+YNKglv26YRNjqsTSuWRaAH4/+l8THyRz7egoPE5P4+cRlFo3vwoTFodnUeuPNnjGFDq2aEvz5cmbPX5RhfbnyFfjlwE88evQIbUoKYd/vJTb2RoZy3+3aQZ36DSlQIH1/tmnXgejoKPr36kqNWrUpXKQIa1YF4ztyrKmblCVmzZhM+1ZNCPr8EwIy2S/Xrl7B1taWcaN86dujM7NmTOb+vXvq+tgbN+jT411aNq5L3rx56dazNwCDhgxnzepgRg/zYdS4iVz+70VuxMTQtHnLbGubqZSvUJEDP6cfKykpKfywby9xmRwrSU+esHNbKI2aNgOgXfuOREdfp3f3ztSsXYciRd5i9cogRowem80tMJKiMW4xA9k20Tx37lxq1qyJr6/vK30+MDCQwMBA9bVW5451Ea9XqivhUTJ9Jq5izqiO2OfOxfE/rnHhShza1DS6j1vBvNGdmPB+Sy5eiePw6atoU1Mz1HEl6g6jF2xm9dz+WFlbsffgOe4nPEGbmoa1lYYSRQty8epN/D/ZReW3Xfn2i5FU6zaf2/cSGTF3k1rPyD6N+eanP7Cy0rB2gTe5bK0J+vqXf5zHyAmz5y0E4LtdO/l06RKWfhast759p87cjItl2KAB5MplR43adTh+5JBeGZ1Oxzf/2Y7fpD+HWXLnzsPCj5aqrz/+cCED3vMhJvo6a1etAOC9wb6UfbuciVr2egLmpSeCb3ft5NOlH7H0sxV661NTUzl+7AhfrttM4SJF+Hz5xyxaEMDCj5YBULRYMTZu2cmTJ4+ZOW0yP/34Ay1bt6NkqdKs+DJErWPUMB8C5i1i357v2B+2D3v7vIydMBlHx3zZ2+As0PHdLsTFxTL4vf7kypWLWrXrcvSw/rGSkvKMyRPHUbtuPZo2awFA7jx5+DDwE7XMR4s+wPt9H6KjovhyZfrx6DN0mPkdK2by698Y2Zaa3N3d6dOnD/PmzVPfq1atGkeOHDHo835+fsTExKjLqyaE5345GU5Ln2XU67uYyYE7cCmcj4tX4zh7+QadRn5Ond6LeH/GOlwK5+PClbhM69gRdoZGA5dQv+9iVm49SO5cNlyJvkP0zfukpqaxefcJAH6/FMP12HgqltEfa3VzcaJV/YoEbznIrOHtWb3tEINnridwcvfXapuptOv4LqdOHufhgwd67yuKwuBhI1n/9XZWrdtIyVKlKVnaQ6/MqZMnePr0GbXr1s+07vNn/+D+vXjqN2zMkkULGDVuIqPGTSBw8QJTNSfLtO/4Lr+dPM6DB/f13nd2dqFajZoUeestFEWhddsOnPvj9wyfz5PHnpat27B397cZ1m3esI5mLVrh4ODAlyu/YP6iQKpUrc7mkHUma48pKYqC7/BRbNq6g7UhmylVujSlPP48VlJSUpgywY/ChYswcUrG+SuAc/8/Vho2asLihfMZO34iY/wmsviDeZmWz0mKohi1mINs7a/MmDGDkJAQYmNjAfD392fevHkcPXpULXPlyhVCQ00/lOJc6M+x2amDW3PgxGWuRt/Ve/+9znV5nPyMn49n/qv9eVmNRmHemHcJ3vILSckpxD94zE/HL9GibvrZFyWKFqRE0YJc+v8cxnMfTezGpI+2odPpsM9tiw4daWnpf5uDxIQE7ty+rb4+sD8Mx3z5ccyn/wv16dOnJCQ8BODB/fus+3Il/b0H6ZXZtXMb7Tu+i5VVxsk0bUoKny4LZMyEyUD6BG36EKuSYR7KHPx9v/y8P4x8+fKTL19+vXLNW7bm4vlzPHr0CIDDv/5CmbLpY+bRUdfRpqQA6b+Mf94fhkeZt/U+f+NGDMeOHqZLt55otVq0Wm36l4dGw5Mk89svhnj69CkJD9OPlfv377Nm9UoGvpd+rGi1WqZO8sMxXz5mzJqT6ZdkSkoKn3z8EX4TpwDpxwqKgqIxz2PFEpNCtl6nUKhQIUaPHs3MmemnHrZs2ZI1a9YwYcIEbt68Se7cuSlSpAgBAaY/5c5/WDvqVSmNtZUVx/64hu/sDQC836UevdrWQFHgv9du0cvvzyEBn271cSmcj7lffAdA0Oy+uLkUIJeNNXt/Pc/M5X9Oro6av5mgWX2ZN/pd0nRpjJq/mdg7D9X1PVtX54/LN9TJ7o/W/MBnM3tja23NByv3mrz9hnj0KJFpE/14+jQZRaPBycmJwE8+R1EU5gf406BRExo2bsqjR4kM9/FGURR0Oh09+/SjQaMmf9aTmMjPP4axMXRnptsJ+epL2rbvSMGChQAYMnwU40amDzOOGjfB5O001qNHiUydOO5v++ULFEVhXsAMGjZqSsPGTXF2KYr3oCH4DOyNRqOhcJG3mPb/00lPHj/G15vWo7GyIlWrpUatOgwaMkxvO4GLF+A3cSqKopDXwYFWbdrTp3sncufOw/zFgZmFlqPmBczk118OEB9/lxFDfchjb8+u3d8zZ9YMGjVuSqMmTXmUmMjg9weg0WhIS0ujT78BNGrcFIDv9+5hf9gPlCn7Nr27dwagsldVps6YqW5j3drVtOvQiYKF0o8V3xGjGD18KABj/SZmc4sNYB7f80ZRdDqdLqeDeBW5q4zM6RDMUtzhZTkdgtnK7AwhAdZWsl8yY2/7+vslb4+1RpV/tMX7tbf5uuSKZiGEMBFzGRIyhiQFIYQwEUkKQgghVIpGkoIQQoj/k56CEEIIlSQFIYQQKkkKQgghVJIUhBBC/MnycoIkBSGEMBXpKQghhFBZYlIwjxt4CyHEG8gUN8QLDw+nbt26lC1blho1anD+/PkMZdLS0vDz86NChQq88847NGnShIiICIPql6QghBCmohi5GGDo0KEMGTKEy5cvM3nyZLy9vTOU2bVrF4cOHeL333/njz/+oFmzZkyblvGRsZmRpCCEECai0WiMWl7m9u3bnDx5kn79+gHQtWtXoqOjM/QCFEXh6dOnJCcno9PpSEhIwNXV1bCYjW+mEEIIQxg7fBQYGIirq6u6/PVpkwDR0dG4uLhgbW2t1u/m5kZUVJReuQ4dOtC4cWOcnZ1xcXHhxx9/ZM6cOQbFLElBCCFMxNik8PcnTPr5+b3Sdk+ePMm5c+e4ceMGsbGxNGvWzOBHIUtSEEIIU8niOYXixYsTFxeHVqsF0p99HhUVhZubm165devW0bRpU/Lnz49Go2HgwIH89NNPBoUsSUEIIUwkq88+KlKkCFWrViUkJASAbdu24erqioeH/jPRS5Uqxf79+3n27BkA3377LZUqVTIoZrlOQQghTMQU1ykEBwfj7e3NggULcHR0ZM2aNQD4+PjQsWNHOnbsyIgRI7h48SKVK1fGxsYGZ2dngoKCDItZHsf5ZpHHcf4zeRxn5uRxnJnLisdxFh/xH6PKR3/W6bW3+bqkpyCEEKZigflWkoIQQpiIJd7mQpKCEEKYiCQFIYQQKkOuUjY3khSEEMJULK+jYLlJ4f6JT3M6BLPk1Gh6Todgtu4fmJ/TIYh/GRk+EkIIoZKkIIQQQmWBOUGSghBCmIr0FIQQQqgsMCdIUhBCCFORnoIQQgiVBeYESQpCCGEqGo3lZQVJCkIIYSKSFIQQQqhk+EgIIYRKJpqFEEKoJCkIIYRQWWBOkKQghBCmIj0FIYQQKgvMCZIUhBDCVKSnIIQQQmWBOUGSghBCmIr0FIQQQqjkimYhhBAqC+wovDgpODk5Zdr90el0KIrCvXv3TBaYEEJYujdu+OjMmTPZFIYQQrx5LDAnvDgplChRQv07Li6OS5cu0bhxY7RaLWlpaSYPTgghLJkl9hQ0hhQKDQ2ldu3aeHt7A3D+/HneffddE4YlhBCWT1GMW8yBQUnhgw8+4NSpUzg5OQFQuXJlrl+/btLAhBDC0imKYtRiDgxKClZWVhQsWFDvPVtbW4M38uzZMyZPnoyHhwfly5fH09OTr776CoDIyEisrKzw8vJSl6CgICOa8PquX49kQN9edGjbij49uhIREZ5pue3bttKhTUvatW5OwMwZpKSk6K3X6XT4vDeA+rWrq+/FxETTt1d3Ondsx6oVf7br6pUrjB7ha5oGvYYWtcrw6+rhHP9qFAdWDMXTwxmAfcsHcXHreI6uHcnRtSMZ1bNupp9vXtNDLXN07Uiu/mcyh78coa5POjSfE+tGqevrVU4foszvYMfe5YM4sW4US8d3VMsXyp+HfcsHYW1l0KGabbLimPmndefPnaVHl0507tCWXTt3qOWPHT3CnNkzTduw1yT7Rd8bmxQcHBy4deuWGvSPP/5IgQIFDN6It7c3ERER/P7771y8eJFvvvmGhQsXsnr1arX+M2fOqIuvb/Z+Wc6dPZOu3Xrwze59vDdoMDOnTclQJiYmms+XL2PNug18u+cH4uPvsm3rFr0y679aS/Hibnrvfb1pI7169yV0xy52/WcHjx8/QqfTsXjhAiZNnW7Sdhkrv4Mda2b1YPC8UGoOXM60z/ayZlYPdf2kT3ZT2/tTant/yvKvD2daR9jxCLVMbe9POX0plq+/P6NXpvnwler6Q7+n9zh7tfTiwKmr1BiwnLdLFKJCySIALBrVFv+g79Gmmtcc1useMy9a9+WqlUyeNoMNX4cS9MWnACQnJxP0+aeM9ZuQfY18BbJf9L2xw0eLFi2iTZs2XL16lfr16zNgwACWLFli0AbCw8PZuXMnK1aswN7eHgB3d3eWLFlCQEDAq0eeReLj47lw/hztOqT/Om3eshU3b94k6m/DY2Hf76NRk6YUKlwYRVHo3rM3e3Z/q66PiAjnp/1hvO8zRO9z1tbWJCUnodVq0aXpUBQNW7/eRJ169XB1LW76BhqhVLGC3Hv4hIvXbgNw6PfrFH8rH15li75SfS6FHGhSvTQb9555adkUbSp5ctmgKAq5bKx5pk2lRa0yPEhM4vj56FfavqlkxTHzonXW1tYkJyXx7NlTrDRWAHzx2XL69huAo6NjNrbUOLJfMnpjewrVq1fnp59+YtOmTUybNo3z58/j5eVl0AZOnz5NmTJlMgw/1alTh+joaO7cuUNiYqLe8FF0dPZ9Cdy6GUehwoWxtk4/EUtRFJxdXIiLi9UrFxcXR9GixdTXRYsW42ZcHAApKSnMmeWP/6w5aP42zNGnX3/2h4XRv09PBrz3Po8eJfLD9/vo13+giVtmvIjouxTIl4faldJ7O+3ql8PR3o4SLvkBmDusFSfWjWL9nJ64F3V6aX392lZl35FL3HnwWO/93cve59jakSwa1YY8djYAbNp3htKuBTm6ZgT7T14h9k4Ckwc2ZtaKH7K2kVkgK46ZF60bOmwEq1YG4zt4EOMmTOK/Fy9yIyaa5i1bmbppr0X2S0YajWLUYg4MvqL54cOHxMfHoygKiYmJ5M+fP8uCeD589CKBgYEEBgaqr0eN8WPMOL8si+F1BH/+Kc2at6BU6dLcuBGjt65w4SIErVytvp4wbjTjJ07hxPFjbNm8CVtbW0aP89P7h5BTEh4/pc+MjczxbYl9bluOn4/mwrVbaFPTGDQ3lJjbDwHw7Vqb7YsHULXfshfWN7BdNcYv/VbvvbJdFhN96yF57GxYPrETC0a0YeySXTxJTqHPjE1qucWj27Ik5BdKFyvIpAGNAFj41c+cjbiZxa02P6VKl2bNug0ApKam4jv4feYvXMye777lh+/3YZ83LxMnTcExX74cjjR7WeJ+MZMf/0YxqKewceNGqlSpwvbt2wkNDaVq1aps3rzZoA1UqVKF8PBw4uPj9d4/cuQIxYsXp3DhwgbV4+fnR0xMjLpkVUJ4y9mFu3fuoNVqgfTJ4ptxcbi46A+ZuLi4EBt7Q30dG3sDZxcXAE6ePMGmDSG0adEU7/59ePToEW1aNM1wxXfY9/twLe5GufLlWbhgLnMXfECXbt35fPknWdKWrPDLqWu0HLmKeoM+Z/Ly3bgUdOTitdtqQgAI2naUkkWdKOCY+x/raVClJHa21vxwTH+iMfpWej1PklNYsf2YOtH8V9XLu1LYyZ49hy+xZFx7pn62l2mf72PJ2PZZ1MrXkxXHzIvW/VXI+q9o0ao1Dg6OrAj6nMVLPqZa9eqErP/KFE17LbJfMtIoilGLOTAoKcyZM4eTJ0+yfft2duzYwYkTJ5g9e7ZBGyhTpgwdOnRgyJAhPHnyBEg/42j8+PH4+/u/cuBZpWDBgpSvUJHvvtkFpH9xv+X8Fm4l9L+smrdoxYGf9nP3zh10Oh1bv95E6zbtAFi7fiN7w35izw/7Wbt+I3nz5mXPD/v1JuMTEhLYELIO3+EjAUhOSkZRNGg0GnW/mAPngg7q31O9m3Dg1BWu33xAESd79f13G1fk9v1H3EtI+sd6vNtXY/3uU6Sl6dT38jvYkTtX+nCRoih0a+7J75fj9D5nbaVh3vBWTP5kNwB57GxBB7o0Hfa5DT/jzZSy4ph50brnYmKiOXr4EN179EKr1aJNTUVRFDSKeR0zz8l+ycgSJ5oNGj7KkycPJUuWVF+7u7uTJ08egzeybt06ZsyYgaenJ7a2tlhZWTFx4kTef/99IiMjjQ46q/nPCsB/+lRWrQwmb1575sz7AIDZM6fTuHFTGjdthmvx4gwbMZqB/XsDUL1GTbr16GnwNpYGfoTv8JHY2dkBMHjoMPr07IqNtQ2z587P+ka9In+fZtSr7I61lYZj56Lw/WAHuWys2P7RQHLZWJGWpiP+4RO6TQ7R+0zc3URW7TwOgKN9Ljo1qkj1Afo9oLfdCrN80rvodDqsrTWcuRTLhKXf6ZUZ17cBG/ac5vb99HmIuavC2LFkAADTPttryqYb5XWPGUOOp8UfzGfSlGkoioKDgwNt27Wn27sdyJ0nD4uXfJyNrTWc7Bd9ppg8Dg8PZ+DAgdy9e5d8+fKxdu1aKlasmKHc2bNnGTVqFLdu3QJg/vz5dOnS5eUx63Q63T+tTEhIAODDDz/EysoKHx8fdDoda9asITU1NUfPHkrW5timzZpTI/M6zdWc3D9gPslXmD+7LLiHdJsvjhlVfs+wWi8t07RpUwYMGIC3tzehoaEsWrSIEydO6JV58uQJlSpVYt26ddSvX5/U1FTu3btn0HD9C5OCRqNBURQyK6IoCqmpqS/dgKlIUsicJIV/JklBGCMrkkLboONGld/tW/OF62/fvo2Hhwf37t3D2toanU6Hi4sLv/76Kx4eHmq5VatWsX//fjZu3Gh0zC+cU0hLSyM1NZW0tLQMS04mBCGEsATGzikEBgbi6uqqLn894xIgOjoaFxcXvdN+3dzciIqK0it34cIFcuXKRfv27fHy8mLAgAHcuXPHoJjN694BQgjxBlGM/O/vZ1n6+b3aWZZarZawsDCCg4M5ffo0xYoVY9iwYQZ91qCkEB4eTps2bShatCgFChRQFyGEEP9Moxi3vEzx4sWJi4vTO+03KioKNzf92+u4ubnRpEkTihUrhqIo9OvXj6NHjxoWsyGFBg8ejLe3N05OThw4cIBu3boxYYJ53mtECCHMRVZf0VykSBGqVq1KSEj62X/btm3D1dVVbz4BoEePHpw4cUI9WWj37t1UrlzZsJgNKZSQkEDPnj3RaDR4enoSHBzMzp07DdqAEEL8W5ni4rXg4GCCg4MpW7YsCxcuZM2aNQD4+Piwa1f6NSJubm5MmzaNunXr8s4777B//36D7z5t0Py6jU36BUcODg5ERkbi7OzM3bt3DdqAEEL8W5nigrS3336bI0eOZHh/1apVeq/79+9P//79ja7foKTQsGFD4uPjGTlyJNWqVcPW1pZevXoZvTEhhPg3MZc7nxrDoKTw4YcfAtCnTx8aNGjAw4cPqVSpkkkDE0IIS2eBOeHFSeH5JMVf5cuXj3z58pGQkGC29zAXQghzYC43uTPGC5NC/vz5M1zR/Px1Tl/RLIQQ5s7yUsJLkkJamnk9AlEIISzJGzunIIQQwnhm8jA1o0hSEEIIE5GeghBCCJW5PHfZGJIUhBDCRCwwJ7w4KcyZM+eFH545c2aWBiOEEG+SN274KDExEYCYmBh+/PFHOnbsiKIo7Nq1i2bNmmVLgEIIYaksLyW8JCk8v5K5ZcuWnDlzhqJFiwLpPQhvb2+TByeEEJbsjbt47bnY2Fg1IQC4uLhw48YNkwUlhBBvAgvMCYbdOtvV1ZVZs2YRHR1NdHQ0s2fPxtXV1dSxCSGERVMUxajFHBiUFNauXcvFixfx8vKiSpUq/Pe//2Xt2rUmDk0IISybsc9oNgcGDR85OzuzZcsWU8cihBBvFEucUzCop/Dw4UNGjhxJhw4dALhw4QKbNm0yaWBCCGHp3tiewtChQ6lUqRI///wzACVLlqRPnz707t3blLGJV3D/wPycDsFsOTWcltMhmKX7vyzI6RDeWFbm8k1vBIN6CpcvX2bGjBnqYzlz586tdzttIYQQGVniRLNBPQVbW1u910lJSZIUhBDiJSzxNhcG9RSaNGnC/PnzSU5OJiwsjG7dutG5c2dTxyaEEBZNoxi3mAODksLcuXPRaDQ4Ojoybdo06tWrx6xZs0wdmxBCWLQ3dvjowoULTJ06lalTp6rv/fHHH7zzzjsmC0wIISydufz6N4ZBPYXM7nMk9z4SQogXe+NOSb19+zY3b94kKSmJs2fPqpPLDx8+5PHjx9kSoBBCWCpLvHjthUlh06ZNLF26lNjYWDp27Ki+ny9fPiZNmmTy4IQQwpIZNBRjZl6YFMaMGcOYMWOYO3cu/v7+2RWTEEK8ESywo2BYIvPy8uLBgwfq6/v37/Pdd9+ZKiYhhHgjWGkUoxZzYFBS8Pf3J3/+/Orr/PnzS89BCCFewhKvUzDolNS/UxSF1NTUrI5FCCHeKJY40WxQT8HBwYHDhw+rrw8dOoSDg4PJghJCiDfBG3dK6nOLFy+mc+fOlCtXDoDw8HB27Nhh0sCEEMLSmcuQkDEMSgp16tTh4sWLHDlyBIC6devqzTEIIYTISMHysoLBcwpOTk60bdvWlLEIIcQb5Y3rKTRq1IgDBw7g5OSkd7MmnU6Hoijcu3fP5AEKIYSleuOSwubNmwE4c+ZMdsQihBBvFHO586kxXpgUXFxcAChRokS2BCOEEG+SN66nULJkyRdmuqtXr2Z5QEII8aYwl6uUjfHCpPDtt98C6cNIkZGRDB06FICVK1dK70EIIV7CFDkhPDycgQMHcvfuXfLly8fatWupWLFipmV1Oh3NmjXj1KlTercqepEXJoXnG9q7dy8nTpxQ369Xrx41a9Zkzpw5BjZDCCH+fUwxpTB06FCGDBmCt7c3oaGheHt7630//9XHH39M6dKlOXXqlMH1G3RF89+fn/D48WMePnxo8EaEEOLfSINi1PIyt2/f5uTJk/Tr1w+Arl27Eh0dTURERIay58+fZ+fOnUyZMsXImA3Qp08fateuzdy5c5k7dy5169ZVgxJCCJE5Y29zERgYiKurq7oEBgbq1RcdHY2LiwvW1tb/r1/Bzc2NqKgovXIpKSkMHjyY4OBgrKysjIrZoKQwe/ZsFi5cyIMHD3jw4AGLFi1i5syZRm3o79zd3Tlz5gze3t4UK1YMLy8vdckJ169HMqBvLzq0bUWfHl2JiAjPtNz2bVvp0KYl7Vo3J2DmDFJSUl667vy5s/To0onOHdqya+eftwc5dvQIc2a/3n40Ndkv6VrUKsOvq4dzfN0oDqzwxdPDWV03fVAz/tjsx4n1o9m73CfTz5dwceLQlyM4unYkJ0PGsGFeb/I72AHQvFYZjq4dqS5X/zOFw2tGAJDfwY69y304sX40Syf8+aCrQvnt2fepD9ZW5vUYF0OOlxs3Yhjk3Z96tarRo0snvXVpaWks+XARXTq1p1P71szyn0bKs2cAxMRE07dXdzp3bMeqFUHqZ65eucLoEb6mbdgrMvYuqX5+fsTExKiLn5/fK203ICCALl26UL58eeNjNrRgy5YtGT58OEuWLKFNmzZGb+hFJk6cyJkzZ9QlJ8ydPZOu3Xrwze59vDdoMDOnZexyxcRE8/nyZaxZt4Fv9/xAfPxdtm3d8tJ1X65ayeRpM9jwdShBX3wKQHJyMkGff8pYvwnZ18hXIPsl/Yt5zeyeDJ4XSs0By5n22V7WzO4JwIgedfEs7Uy1fsuo0f8TBs7anGkdcXcTaOYbTG3vT6nebxlxdxOZMag5AGHHwqnt/am6nL4cy9ff/w5Ar5ZeHDh1lRr9P+HtEoWpUOotABaNbov/F/vQpqZlwx4wnCHHS177vIwYNYYPFi/JsG7HtlAuXjjP11u3s/ObPWgUDRtC1gHw9aaN9Ordl9Adu9j1nx08fvwInU7H4oULmDR1usnb9io0imLU8jLFixcnLi4OrVYLpE8kR0VF4ebmplfuwIEDLF++HHd3d+rXr09CQgLu7u7cuXPn5TEb0rCff/6ZEiVK0KRJEwBOnDjxRg0fxcfHc+H8Odp1SP8l1rxlK27evEnU9et65cK+30ejJk0pVLgwiqLQvWdv9uz+9qXrrK2tSU5K4tmzp1hp0rtyX3y2nL79BuDo6JiNLTWO7Jd0pYoV5N7DJ1y8dhuAQ79HUvytfHiVLcq4Pg2Y8cVeUrTpt5K/de9RpnU8S0kl+Vn6P2SNRiGPnY36zPO/cinkQJPqpdm49zQAKdo08tjZoCgKuWyseZaipUWtMjxITOL4+WhTNPeVGXq85Mufn6rVqpM7d+4MdVy69F9q16mLja0tiqJQr0FDvv3mP0D68ZKUnIRWq0WXpkNRNGz9ehN16tXD1bW46Rv4CrL6LqlFihShatWqhISEALBt2zZcXV3x8PDQK3fw4EGuX79OZGQkv/76K46OjkRGRlK4cOGXbsOgpDBlyhQOHjxIwYIFAahRowanT5825KMG+fDDD9Who+nTsz/j37oZR6HChfXG6ZxdXIiLi9UrFxcXR9GixdTXRYsW42Zc3EvXDR02glUrg/EdPIhxEybx34sXuRETTfOWrUzdtNci+yVdRPRdCuTLQ+1K6b/G2tUvh6O9HRVKvUWRAnnp0KACv6wcxi8rh9Gtmec/1mNjbcXRtSOJ2T0Dj+KFmLsqLEOZfm2rsu/wJe7cTz+xY9O+05R2LcjRtSPZfyKC2DsJTB7YhFnB35umsa/B0OPlRSpUrMjPP+3n0aNHpKSk8P2+PcTeuAFAn3792R8WRv8+PRnw3vs8epTID9/vo1//gSZpT1bI6p4CQHBwMMHBwZQtW5aFCxeyZs0aAHx8fNi1a9drx2zQDfFSU1MpXbq03nu2travvfHnJk6cyNixY7OsPnNTqnRp1qzbAKTvS9/B7zN/4WL2fPctP3y/D/u8eZk4aQqO+fLlcKTZy1L2S8Ljp/SZvpE5w1phn9uW4+eiuHD1FpD+RW+Xy4aGg7/AzTk/Pwf7cun6Hc5G3MxQT4o2ldren2JjbUWgXwd83q1J4IaDemUGtq/O+I+/UV8/SU6hz/SN6uvFo9uyJOQApV0LMmlAYwAWrv0p0+1Zok7vdiEuNpb3B/bDzs6OWrXrcMTqEACFCxchaOVqteyEcaMZP3EKJ44fY8vmTdja2jJ6nJ/ej5CcZopTUt9++231jtV/tWrVqkzLu7u7G3yNAhjYU7Czs+PRo0fq1c1nz57NtOtnSn+flV/2ceDLP2Sgt5xduHvnjt443c24OFxciuqVc3FxITb2hvo6NvYGzv+/FciL1v1VyPqvaNGqNQ4OjqwI+pzFSz6mWvXqhKz/Ksvak1Vkv/zpl1NXaTliJfXe/4zJy3fjUsiRo2evk/j4KZv2pfeao24+4MjZ61Qr7/rCulK0qaz/7jd6t66i936DKiWxs7Xmh2OZT+ZXL+9KYae87Dl8iSVjOzD10z1M+2wvS8Z1yJpGviZDj5cXURSFYSNGsWXbTtZt2Eyp0h6U/tvQCKQPS7oWd6Nc+fIsXDCXuQs+oEu37ny+/JMsa09WsFIUoxZzYPAzmlu2bMmNGzfo168fLVq0YN68eaaOTc/fZ+XHjHu1WfnMFCxYkPIVKvLdN+ldr7Dv9/GW81u4/e2q7eYtWnHgp/3cvXMHnU7H1q830bpNu5euey4mJpqjhw/RvUcvtFot2tRUFEVBo2h48uRJlrUnq8h++ZNzwT+fNDj1vaYc+O0KV2/cY0vY77SsXRYAJ4fcVK/gyrlMfrW7Oecndy4bIP2Lr0vTShnKeXeozvrdp0hLyzjXYG2lYd7w1kz+ZDcAeXKn16XT6bDPnXW99tdh6PHyIk+fPiXh/9dA3b9/jzWrVuD9vv4ZXQkJCWwIWYfv8JEAJCcloygaNBrzOV6eU4xczMFLh490Oh2enp5s2LCBvXv3otPpCAgIyDCcZOn8ZwXgP30qq1YGkzevPXPmfQDA7JnTady4KY2bNsO1eHGGjRjNwP69AaheoybdeqSfhfKidc8t/mA+k6ZMQ1EUHBwcaNuuPd3e7UDuPHlYvOTjbGyt4WS/pPMf3Jx6ld2xttJw7FwUvh9sB2DmF/sInt6NIV1qA7Ak5BdOXoxJ/4xPc+LuJrBq53EqlXZm9tAWAGg0Gs5cuqE3TORon4tOjSpSvf+yTLc/rm8DNuw9xe376RPZc1eGseOj9LH0aZ/tMU2jX4Ehx0tSUhId27Ui5dkzEhMf0aJpQ9p36MSYceN5lJjIoPf6oygadLo0+vQbQOMmTfW2sTTwI3yHj8TOLv2U3sFDh9GnZ1dsrG2YPXd+trf5RSzxGc2KLrNTIP7ieVI4d+5cdsVkkGRtTkcgLI1Tw2k5HYJZuv/LgpwOwSzZGfwIsn+24bcYo8r3rfbiocfs8NLhI0VRcHV15e7du9kRjxBCvDGy+pTU7GBQLsybNy9eXl60bduWvHnzqu///RJsIYQQf3rjHrLznKenJ56e/3z+tRBCiIzM6yYkhnlpUjh37hyenp5Urlz5jZtcFkIIU7LEnsILE9nnn39O/fr1WbRoEdWqVWPHjh0vKi6EEOIvLPGU1JcmhT/++INjx45x8OBBlizJeAMrIYQQmVMUxajFHLxw+MjGxka9+56np6fZXRgihBDmzFyuUjbGC5NCcnIyZ8+eVe/mmJSUpPf6nXfeMX2EQghhoSwvJbwkKSQlJdGxY0e9956/VhSFq1evmi4yIYSwcBbYUXhxUoiMjMymMIQQ4s1jyHOXzU0WXMgthBAiM29cT0EIIcSrU6SnIIQQ4jnpKQghhFDJnIIQQgiV9BSEEEKoJCkIIYRQvXFXNAshhHh1cvaREEIIlQV2FCQpCCGEqUhPQQghhEpjeTlBkoIQQpiK9BSEEEKoZE5BCCGEygJzgiQFIYQwFY0FdhUkKYh/jfu/LMjpEMySU90JOR2CWUo6/tFr12F5KUGSghBCmIwiPQUhhBDPWWBOkKQghBCmYoE5QZKCEEKYjAVmBUkKQghhInLxmhBCCJXMKQghhFBZYE5Ak9MBCCHEG0sxcjFAeHg4devWpWzZstSoUYPz589nKLN//35q1qxJhQoVqFixIpMmTSItLc2g+iUpCCGEiShG/meIoUOHMmTIEC5fvszkyZPx9vbOUMbJyYnNmzdz4cIFfvvtNw4fPsy6desMql+SghBCmIiiGLe8zO3btzl58iT9+vUDoGvXrkRHRxMREaFXrkqVKpQqVQoAOzs7vLy8iIyMNChmSQpCCGEixiaFwMBAXF1d1SUwMFCvvujoaFxcXLC2tv5//Qpubm5ERUX9Yww3b94kNDSU9u3bGxSzTDQLIYSJGHtKqp+fH35+flm2/YSEBDp06MCkSZOoXr26QZ+RpCCEECaS1aekFi9enLi4OLRaLdbW1uh0OqKionBzc8tQNjExkdatW9OpUyejEo0MHwkhhIlk9clHRYoUoWrVqoSEhACwbds2XF1d8fDw0Cv36NEjWrduTevWrZkxY4ZRMUtSEEIIUzHBKanBwcEEBwdTtmxZFi5cyJo1awDw8fFh165dACxbtozjx4+zfft2vLy88PLyYv78+YaFrNPpdIa30Hwka3M6AiHeDPI8hcxlxfMUzt94bFT5isXsX3ubr0vmFIQQwkTkNhdCCCFUFpgTJCkIIYTJWGBWkKQghBAmIrfOFkIIodJYXk6QpCCEECYjSUEIIcRzMnwkhBBCZYmnpGbbFc1arZaAgADKlStHpUqV8PLyYsiQIZw5cwYrKyv1qjsvLy+CgoKyKyzV9euRDOjbiw5tW9GnR1ciIsIzLbd921Y6tGlJu9bNCZg5g5SUlJeuO3/uLD26dKJzh7bs2rlDLX/s6BHmzJ5p2oa9JkP2y7GjR+jTsxudO7Slc8d2fPzRYvWBHod+PUiPLp3UpXnj+vTs1hmAhIcPGeTdn67vdmD+nNlqfffu3WOQd3+9fWtu5HhJ16L22/z61RiOb/DjwOpReJZxAeCXL0dzNGQcR0PGcXLTBJKOf0QlD5dM6+jbrjonNo7naMg4jqwfR6u65dR1reqW4/C6sWo9fdv9eVO35VO6cmLjePZ87oujvZ36/s6lPpQsVtBELTaOCS5oNrlsu6J54MCB3Lt3j3Xr1uHk5IROpyM0NJRq1apRtWpVHjx4YFR9WX1Fs897A+jQ8V06de7CD/v2smb1SjZu2aZXJiYmGu9+vdm8dQcFCxVizMhh1K3XgF59+r5w3fixo+nTrz/lK1SkW+cO7N73I8nJyQwbMohln36Bo6Nj1jYmCxmyXy5evIBDXgdcixfn6dOnDBnkTZeu3enUuUuG+kYOH0qNmrUY6P0+mzaE8PDhA3yHj8TnvQFMnjaDMmXKMm3KRHr17ss7lb2yqZXGe5OOl1e9ojm/Q27ObZ9Ci6Gfc/HqLep5lWTZ5K5U761/JXDnpu8wzacFNfosybhtx9z8d+d03um+iFvxidSt7M6mRd6UaD0bgBs/zKHVsC84FxGHm4sTv2+ZRPFWs3FzdmLJhHdpMzyIqYNacD/hCUFbD/Fep1o4OeYmcP3Pr9Smv8qKK5qv3Ekyqnzpwrlfe5uvK1t6ChEREWzdupU1a9bg5OQEpN8HvHv37mg0OX/7pfj4eC6cP0e7Dh0BaN6yFTdv3iTq+nW9cmHf76NRk6YUKlw4Pf6evdmz+9uXrrO2tiY5KYlnz55ipbEC4IvPltO33wCzTgiG7pfy5SvgWrw4ALly5eLtcuWJjb2Rob7bt29x/OgR2nfoBIC1jTXJycmkpaWR8uwZNjY2HDr4C46O+cw6Icjxkq6Ua0HuPXzCxau3ADh05hrF38qP19vF9MoN7FiTr3Ydz7QOjaKgKJA3Ty4A8jnk5sbtB+p6HTryOaR/UTra23Hv4ROePtOSok0ll40ViqJgn9uWZylanAs60KNVFZZt/MUErX01pnjymqllyzfyqVOnKFOmDIUKFcp0fWJiot7wUXR0dHaEpbp1M45ChQvrPbjC2cWFuLhYvXJxcXEULfrnAV+0aDFuxsW9dN3QYSNYtTIY38GDGDdhEv+9eJEbMdE0b9nK1E17LYbul7+6e+cOYd/vo2GjxhnW7dq5g/oNGlGwYHrXvl37jkRHRdGz67vUqlOXIkXeYuWKIEaNGWuK5mQZOV7SRUTdpUC+PNT2LAFAuwYVcMxrRwkXJ7WMa5F8NKhaik17fsu0jviHTxi9cBtH1o3l0n+mEzSjJ0PmfK2u7z8thM2LBnLpP9P5ccUIfAI2k6JNJTzqDgd+u8KR9WMpWawAm/acYvG4jkz75BtSUw17FnF2yOonr2UHs5hodnBw4MyZMy8sExgYqPcUolFj/BgzLuseRmFKpUqXZs26DQCkpqbiO/h95i9czJ7vvuWH7/dhnzcvEydNwTFfvhyO9PU8evSI0SN88X7fh4qVPPXW6XQ6dm7fxuRpf97GN0+ePCxZ+on6+sOFC3hv0GCioqJYvSJ9Xmnw0OG8Xa4c/yaWcrwkPE6mz5R1zBnRFvvcuTh+9joXrt5E+5cv5X7ta7Dn14vEP3ySaR2O9naM6NWABu99wqXI27StX4GvFw/Eq8eHpOl0THm/Ob0mf8Wh01epVr44W5e8R43eHxH/8AkBQXsJCNoLQPuGFYm59ZDrcfcJ9u+Jo30utoX9TmjY79myL/6JmXzPGyVbegpVq1YlPDyc+Pj4V67Dz8+PmJgYdcnKhPCWswt379xBq02fqNDpdNyMi8PFpaheORcXF71hkdjYGzi7uLx03V+FrP+KFq1a4+DgyIqgz1m85GOqVa9OyPqvsqw9WcXQ/QLw+PEjhg/1oXHTZgzwfi/D+pMnjvP02VPq1quf6bbO/vEH9+7F06hxExYtmMe4CZMYO34iiz6Yl7WNygJyvPzpl9+u0NL3C+oNXMrkZbtwKeTIxWu31PUDOtRg7a5j//j5ZrXK8iAxiUuRtwHY/esFHOztcHNxonLZorgUduTQ6asA/HYxmtjbD6n8t+EpB/tcjO3XiLkr9jGyVwMOnrpCv+khTPVpgV2uHP7da4EzzdmSFDw8POjatSuDBg1SJ5R1Oh3btm1Tz1LJSQULFqR8hYp89036vcjDvt/HW85v4VaihF655i1aceCn/dy9cwedTsfWrzfRuk27l657LiYmmqOHD9G9Ry+0Wi3a1FQURUGjaHjyJPNfUjnJ0P3y5PFjhg/xoW69+gzxHZ5pXTu2h9KpU2esrKwyrEtJSWFp4IdMmDQVgKSkpPT9orHs/fJvOF6cCzqof08d1IIDJyO4GpP+469xDQ+srTT8eCzzM7MArt2I552yxXjr//XU8iyBtZWGmFsPiLn1AOeCDrztXgRIn8MoWawg4dfv6NUxd0Q7Fqz6gaSnKdjntkVH+veLjbUVttY5mxQ0imLUYg6ybY99+eWXzJs3j1q1amFtbU1aWhoNGzakdOnS2RXCC/nPCsB/+lRWrQwmb1575sz7AIDZM6fTuHFTGjdthmvx4gwbMZqB/XsDUL1GTbr16AnwwnXPLf5gPpOmTENRFBwcHGjbrj3d3u1A7jx5WLzk42xsreEM2S8bQtZx7txZkpKS2B/2AwAtWrVm8NBhQPqc0Y9hP7BtxzeZbuOrNavp0OldCv5/zmn4yNGM8B0CgN+ESaZu4iuR4yWd/9BW1PMqhbWVhmNnr+M7b4u6zrtjTdZ9c4K/n+Do06UOLoUcmbtiH2cu3WDxmjD2fOZLSmoqWm0a/aat5+kzLbfvPWLkB6GELOhPmk6HRlHw+2gH0bceqHXVeced3Lls2H88PfEEbT3Munl9Gd+/CRt3/0bC4+Rs2Q//xDy+5o0jD9kR4l9OHrKTuaw4JTXm/lOjyrs65Xrtbb4us5hoFkKIN5Pl9RUkKQghhImYyTSBUSQpCCGEiVhgTpCkIIQQpiI9BSGEECpzuXWFMSQpCCGEqVheTpCkIIQQpmKBOUGSghBCmIq5XKVsDEkKQghhKpaXEyQpCCGEqVhgTpCkIIQQpmKBo0eSFIQQwlTklFQhhBAqS+wp5PwDkoUQQpgN6SkIIYSJWGJPQZKCEEKYiMwpCCGEUElPQQghhEqSghBCCJUMHwkhhFBJT0EIIYTKAnOCXKcghBAmoxi5GCA8PJy6detStmxZatSowfnz5zMtt3r1asqUKUPp0qUZPHgwKSkpBtUvSUEIIUxEMfI/QwwdOpQhQ4Zw+fJlJk+ejLe3d4Yy165dw9/fn4MHDxIREcGtW7dYsWKFQfVLUhBCCBNRFOOWl7l9+zYnT56kX79+AHTt2pXo6GgiIiL0yoWGhtKxY0ecnZ1RFAVfX182bdpkUMwWO6dgZ0aRBwYG4ufnl9NhmCXZN5kzp/2SdPyjnA5BZU77JSsY+z0VGBhIYGCg+trPz09vf0RHR+Pi4oK1dXrFiqLg5uZGVFQUHh4earmoqChKlCihvnZ3dycqKsqgGKSnkAX++j9R6JN9kznZL5n7t+8XPz8/YmJi1CUnEqQkBSGEsBDFixcnLi4OrVYLgE6nIyoqCjc3N71ybm5uXL9+XX0dGRmZocw/kaQghBAWokiRIlStWpWQkBAAtm3bhqurq97QEaTPNezatYubN2+i0+kICgqiV69eBm1DkkIWeJPGQLOa7JvMyX7JnOyXlwsODiY4OJiyZcuycOFC1qxZA4CPjw+7du0CoFSpUgQEBFCvXj08PDwoXLgwQ4cONah+RafT6UwWvRBCCIsiPQUhhBAqSQpCCCFUkhQM5O7uTrly5dRZf4Dq1avz888/AxAWFkaDBg0oXbo01atXp1mzZhw8eDCHos1+z549Y/LkyXh4eFC+fHk8PT356quvgPQzH6ysrPDy8lKXoKCgHI44e7m7u3PmzBm8vb0pVqyY3r74N9JqtQQEBFCuXDkqVaqEl5cXQ4YM4cyZM//6YyWnmdElYObv6dOnrF69OsOETVhYGP3792fbtm3UrVsXSL8/ye+//54TYeYIb29vnj59yu+//469vT2RkZG0adMGrVZLs2bNcHBw4MyZMzkdplmYOHEiY8eOzekwctSgQYO4d+8eR44cwcnJCZ1OR2hoKI6OjnKs5DBJCkaYPXs206dPp3///uTJk0d9PyAgAH9/fzUhAJQpU4YyZcrkRJjZLjw8nJ07dxIdHY29vT2Q/st4yZIl+Pr60qxZsxyOUJiTiIgItm7dSlRUFE5OTkD6lbndu3cnMjIyZ4MTMnxkjMqVK9OkSRM+/vhjvfd/++036tSpk0NR5bzTp09TpkwZChYsqPd+nTp1iI6O5s6dOyQmJuoNCURHR+dQtDnvww8/VPfD9OnTczqcbHfq1CnKlClDoUKFMl0vx0rOkp6CkebOnUvNmjXx9fXN6VAsigwJ/EmGj15MjpWcJT0FI7m7u9OnTx/mzZunvletWjWOHDmSg1HlrCpVqhAeHk58fLze+0eOHKF48eIULlw4hyIT5qhq1aqZHi/CPEhSeAUzZswgJCSE2NhYAPz9/Zk3bx5Hjx5Vy1y5coXQ0NCcCjFblSlThg4dOjBkyBCePHkCpJ9xNH78ePz9/XM4OmFuPDw86Nq1K4MGDeLBgwdA+j18tm3bRlpaWs4GJyQpvIpChQoxevRo4uLiAGjZsiVr1qxhwoQJeHh44OnpyZAhQ3B2ds7hSLPPunXrKFWqFJ6enpQvX5727dszceJEBg8enNOhCTP05ZdfUrlyZWrVqkXFihWpUKEC33//PQkJCTkd2r+e3OZCCCGESnoKQgghVJIUhBBCqCQpCCGEUElSEEIIoZKkIIQQQiVJQQghhEqSgsgxz+9tU6FCBb3bJffs2dMk22vcuDE7d+7MsnJ/9/z22EJYMrn3kcgxz79AIyMj8fLyyvQLVavVYm0th6kQ2UV6CsLsuLu7M3nyZGrWrMnAgQP5+eef9R5Gc+7cOdzd3dXX+/bto379+lSrVo2aNWvy008/vXQbGzdupFatWlSpUoXKlSvzzTff6K3/8ccfqVGjBh4eHowfP57n13jevHmTHj16ULNmTTw9PZkxY0aWtFkIcyE/wYRZio+P59ixYyiKoj7dLjNXr15l9uzZ7Nu3D0dHRyIiImjQoAGRkZHkypXrHz/XqlUrevfujaIoREZGUrt2ba5fv65+5sKFCxw+fJiUlBQaNmzIpk2b6NOnDwMHDmTatGk0atQIrVZL+/bt2bp1K927d8/qXSBEjpCkIMySt7c3iqK8tNzevXuJiIigYcOG6nsajYaoqKgXPuTo2rVr9O3bl5iYGKytrbl37x7Xrl2jXLlyAAwYMAAbGxtsbGzo168fYWFhdOrUiR9//JFbt26p9Tx69IhLly69RkuFMC+SFIRZyps3r/q3tbU1qamp6uvk5GT1b51OR4sWLdi4caNR9ffq1YuFCxfSrVs3AAoUKKBX798piqIOIR09ehQ7OzujtieEpZA5BWH2SpUqxfXr17lz5w4A69evV9e1atWKsLAw/vjjD/W948ePv7TO+/fvU7JkSQBCQkK4f/++3vqQkBBSUlJISkpi48aNNG/enLx589KkSRMWLlyolouNjSUmJua12ieEOZGkIMxe0aJFmTRpEjVr1qR27doUKFBAXefh4cHGjRsZOnQolStXpnz58ixduvSldS5btoxu3bpRpUoVTp8+jZubm9768uXLU69ePTw9PWnQoAG9evUCYMOGDURERFCpUiU8PT3p0qWLPCxGvFHk1tlCCCFU0lMQQgihkqQghBBCJUlBCCGESpKCEEIIlSQFIYQQKkkKQgghVJIUhBBCqCQpCCGEUP0PGvBTSib7b/AAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 400x280 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Plotter.confusion_matrix(test_set, result, types=fault_types)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[INFO    14:13:25]  \n",
      "[Evaluator]  Performance Evaluation:\n",
      "             Accuracy WeightedF1Score\n",
      "Bearing1_1     0.9662          0.9659\n",
      "Bearing1_4     0.9846          0.9823\n",
      "Bearing2_1     0.9970          0.9970\n",
      "Bearing1_2     0.9832          0.9845\n",
      "Bearing2_3     0.9949          0.9949\n",
      "mean(global)   0.9910          0.9909\n",
      "mean(group)    0.9910          0.9909\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>WeightedF1Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Bearing1_1</th>\n",
       "      <td>0.9662</td>\n",
       "      <td>0.9659</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing1_4</th>\n",
       "      <td>0.9846</td>\n",
       "      <td>0.9823</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing2_1</th>\n",
       "      <td>0.9970</td>\n",
       "      <td>0.9970</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing1_2</th>\n",
       "      <td>0.9832</td>\n",
       "      <td>0.9845</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bearing2_3</th>\n",
       "      <td>0.9949</td>\n",
       "      <td>0.9949</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean(global)</th>\n",
       "      <td>0.9910</td>\n",
       "      <td>0.9909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean(group)</th>\n",
       "      <td>0.9910</td>\n",
       "      <td>0.9909</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Accuracy WeightedF1Score\n",
       "Bearing1_1     0.9662          0.9659\n",
       "Bearing1_4     0.9846          0.9823\n",
       "Bearing2_1     0.9970          0.9970\n",
       "Bearing1_2     0.9832          0.9845\n",
       "Bearing2_3     0.9949          0.9949\n",
       "mean(global)   0.9910          0.9909\n",
       "mean(group)    0.9910          0.9909"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator = Evaluator()\n",
    "evaluator.add(Accuracy(), WeightedF1Score())\n",
    "evaluator(test_set, result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
